home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1993 July / InfoMagic USENET CD-ROM July 1993.ISO / sources / misc / volume27 / psf3 / part05 < prev    next >
Encoding:
Text File  |  1992-01-20  |  52.3 KB  |  2,152 lines

  1. Newsgroups: comp.sources.misc
  2. From: tony@ajfcal.cuc.ab.ca (Tony Field)
  3. Subject:  v27i096:  psf3 - Postscript print filter system, v3, Part05/09
  4. Message-ID: <1992Jan21.013318.11472@sparky.imd.sterling.com>
  5. X-Md4-Signature: 3bf4a9b817ec5eecb089f4658dbe2c65
  6. Date: Tue, 21 Jan 1992 01:33:18 GMT
  7. Approved: kent@sparky.imd.sterling.com
  8.  
  9. Submitted-by: tony@ajfcal.cuc.ab.ca (Tony Field)
  10. Posting-number: Volume 27, Issue 96
  11. Archive-name: psf3/part05
  12. Environment: ISC, SUNOS, SYSVR3, DOS
  13. Supersedes: psf2: Volume 12, Issue 4-9
  14.  
  15. #! /bin/sh
  16. # This is a shell archive.  Remove anything before this line, then unpack
  17. # it by saving it into a file and typing "sh file".  To overwrite existing
  18. # files, type "sh file -c".  You can also feed this as standard input via
  19. # unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  20. # will see the following message at the end:
  21. #        "End of archive 5 (of 9)."
  22. # Contents:  defs/epl3kf51.def getsizes.PS language.PSF man/psfbs.1
  23. #   man/psfbs.doc man/psfdoub.1 man/psfdoub.doc psfbs.c psfmail.c
  24. #   selectdef.c
  25. # Wrapped by ajf@trifid on Sat Jan 18 22:55:49 1992
  26. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  27. if test -f 'defs/epl3kf51.def' -a "${1}" != "-c" ; then 
  28.   echo shar: Will not clobber existing file \"'defs/epl3kf51.def'\"
  29. else
  30. echo shar: Extracting \"'defs/epl3kf51.def'\" \(2791 characters\)
  31. sed "s/^X//" >'defs/epl3kf51.def' <<'END_OF_FILE'
  32. X*printer
  33. XEPSON LP-3000PS F5 v52.3
  34. X*paper 13
  35. XLetter
  36. Xstatusdict begin lettertray end
  37. X  612   792    12    13   602   780
  38. XLegal
  39. Xstatusdict begin legaltray end
  40. X  612  1008    12    12   594   996
  41. XExecutive
  42. Xstatusdict begin executivetray end
  43. X  522   756    12    12   510   744
  44. XA4
  45. Xstatusdict begin a4tray end
  46. X  595   842    12    12   579   830
  47. XA5
  48. Xstatusdict begin a5tray end
  49. X  420   595    10    10   408   585
  50. XB5
  51. Xstatusdict begin b5tray end
  52. X  516   729    12    12   502   717
  53. XStatement
  54. Xstatusdict begin halflettertray end
  55. X  396   612    12    12   379   600
  56. XLetterSmall
  57. Xstatusdict begin lettertray end lettersmall
  58. X    0     0    30    30   582   762
  59. XA4Small
  60. Xstatusdict begin a4tray end a4small
  61. X    0     0    31    31   559   811
  62. XGLT
  63. Xstatusdict begin glttray end
  64. X  576   756    12    13   572   744
  65. XGLG
  66. Xstatusdict begin glgtray end
  67. X  612   936    12    13   602   924
  68. XF4
  69. Xstatusdict begin f4tray end
  70. X  595   935    12    12   579   923
  71. XHagaki
  72. Xstatusdict begin hagakitray end
  73. X  284   420    12    12   272   408
  74. X*order 1
  75. XNormal
  76. X*fonts 80
  77. XAvantGarde-Book
  78. XAvantGarde-Demi
  79. XBookman-Demi
  80. XBookman-Light
  81. XCourier
  82. XHelvetica
  83. XHelvetica-Narrow
  84. XNewCenturySchlbk-Roman
  85. XPalatino-Roman
  86. XSymbol
  87. XTimes-Roman
  88. XZapfChancery-MediumItalic
  89. XZapfDingbats
  90. XGothicBBB-Medium-83pv-RKSJ-H
  91. XGothicBBB-Medium-83pv-RKSJ-H
  92. XGothicBBB-Medium-Add-H
  93. XGothicBBB-Medium-Add-RKSJ-H
  94. XGothicBBB-Medium-Add-RKSJ-V
  95. XGothicBBB-Medium-Add-V
  96. XGothicBBB-Medium-EUC-H
  97. XGothicBBB-Medium-EUC-V
  98. XGothicBBB-Medium-Ext-H
  99. XGothicBBB-Medium-Ext-RKSJ-H
  100. XGothicBBB-Medium-Ext-RKSJ-V
  101. XGothicBBB-Medium-Ext-V
  102. XGothicBBB-Medium-H
  103. XGothicBBB-Medium-NWP-H
  104. XGothicBBB-Medium-NWP-V
  105. XGothicBBB-Medium-RKSJ-H
  106. XGothicBBB-Medium-RKSJ-UserGaiji
  107. XGothicBBB-Medium-RKSJ-UserGaiji
  108. XGothicBBB-Medium-RKSJ-V
  109. XGothicBBB-Medium-V
  110. XGothicBBB-Medium.Oubun
  111. XGothicBBB-Medium.Roman
  112. XGothicBBB-Medium.WP-Symbol
  113. XJun101-Light-83pv-RKSJ-H
  114. XJun101-Light-Add-H
  115. XJun101-Light-Add-RKSJ-H
  116. XJun101-Light-Add-RKSJ-V
  117. XJun101-Light-Add-V
  118. XJun101-Light-EUC-H
  119. XJun101-Light-EUC-V
  120. XJun101-Light-Ext-H
  121. XJun101-Light-Ext-RKSJ-H
  122. XJun101-Light-Ext-RKSJ-V
  123. XJun101-Light-Ext-V
  124. XJun101-Light-H
  125. XJun101-Light-NWP-H
  126. XJun101-Light-NWP-V
  127. XJun101-Light-RKSJ-H
  128. XJun101-Light-RKSJ-UserGaiji
  129. XJun101-Light-RKSJ-V
  130. XJun101-Light-V
  131. XJun101-Light.Oubun
  132. XJun101-Light.Roman
  133. XJun101-Light.WP-Symbol
  134. XPCJun101-Light
  135. XRyumin-Light-83pv-RKSJ-H
  136. XRyumin-Light-83pv-RKSJ-H
  137. XRyumin-Light-Add-H
  138. XRyumin-Light-Add-RKSJ-H
  139. XRyumin-Light-Add-RKSJ-V
  140. XRyumin-Light-Add-V
  141. XRyumin-Light-EUC-H
  142. XRyumin-Light-EUC-V
  143. XRyumin-Light-Ext-H
  144. XRyumin-Light-Ext-RKSJ-H
  145. XRyumin-Light-Ext-RKSJ-V
  146. XRyumin-Light-Ext-V
  147. XRyumin-Light-H
  148. XRyumin-Light-NWP-H
  149. XRyumin-Light-NWP-V
  150. XRyumin-Light-RKSJ-H
  151. XRyumin-Light-RKSJ-UserGaiji
  152. XRyumin-Light-RKSJ-V
  153. XRyumin-Light-V
  154. XRyumin-Light.Oubun
  155. XRyumin-Light.Roman
  156. XRyumin-Light.WP-Symbol
  157. X*slots 2
  158. Xstatusdict begin 0 setpapertray end
  159. Xstatusdict begin 1 setpapertray end
  160. X*eof
  161. END_OF_FILE
  162. if test 2791 -ne `wc -c <'defs/epl3kf51.def'`; then
  163.     echo shar: \"'defs/epl3kf51.def'\" unpacked with wrong size!
  164. fi
  165. # end of 'defs/epl3kf51.def'
  166. fi
  167. if test -f 'getsizes.PS' -a "${1}" != "-c" ; then 
  168.   echo shar: Will not clobber existing file \"'getsizes.PS'\"
  169. else
  170. echo shar: Extracting \"'getsizes.PS'\" \(3336 characters\)
  171. sed "s/^X//" >'getsizes.PS' <<'END_OF_FILE'
  172. X%!
  173. X% getsizes.ps
  174. X%
  175. X% Tony Field,  tony@ajfcal.cuc.ab.ca
  176. X%
  177. X% Attempt to print out the imageable area for all known page sizes
  178. X% in the printer. Print the results on the printer's default paper
  179. X% size. If a different size should be used, modify the "statusdict
  180. X% begin lettertray end" line below.
  181. X%
  182. X% This file should be used only if a standard printer is not defined
  183. X% in the ./defs directory.  If one is defined, then psizes.ps should
  184. X% be used instead.
  185. X%
  186. X% $Id: getsizes.PS,v 3.1 1991/11/27 06:02:58 ajf Exp ajf $
  187. X% ----------------------------------------------------------------
  188. X
  189. X% place current page information on the stack
  190. X
  191. X/getsize 
  192. X{    /nf nf 1 add def    % count page sizes
  193. X    clippath        % current path becomes clip path
  194. X    pathbbox        % put current path llx, lly, urx, ury on stack
  195. X} def
  196. X
  197. X% print the comment, and imageable area coordinates
  198. X
  199. X/sendsize 
  200. X{    /ury exch def
  201. X    /urx exch def
  202. X    /lly exch def
  203. X    /llx exch def
  204. X    /str 64 string def
  205. X    show        % first print "Letter: 612 792" as commentary
  206. X    (  ) show    % then real imageable area for current size
  207. X            % numbers are translated to integer
  208. X    llx    ceiling cvi str cvs show
  209. X    (  ) show
  210. X    lly    ceiling cvi str cvs show
  211. X    (  ) show
  212. X    urx    floor cvi str cvs show
  213. X    (  ) show
  214. X    ury    floor cvi str cvs show
  215. X} def
  216. X
  217. X/newline        % new line, delta = 15 points
  218. X{    /ycoord ycoord -15 add def
  219. X    50 ycoord moveto
  220. X} def
  221. X    
  222. X    
  223. X    
  224. X/pg save def
  225. X
  226. Xnewpath
  227. X/nf 0 def        % count of paper sizes found
  228. X
  229. X% look for any "standard" paper sizes. The expression
  230. X% (Tabloid: 616 729) is a comment that is printed. The "Tabloid"
  231. X% is the name of the paper size, "616" is the physical paper width
  232. X% in points, and "729" is the physical paper height in points.
  233. X% (points = inches * 72)
  234. X
  235. X% The paper dimensions for a given paper size are not always
  236. X% consitent for all printers!
  237. X
  238. Xcurrentdict /executive known {
  239. X    executive
  240. X    (executive:  522    756) getsize
  241. X} if
  242. Xcurrentdict /tabloid known {
  243. X    tabloid
  244. X    (tabloid:    792   1224) getsize
  245. X} if
  246. Xcurrentdict /statement known {
  247. X    statement
  248. X    (statement:  396    612) getsize
  249. X} if
  250. Xcurrentdict /note known {
  251. X    note
  252. X    (note:       612    792) getsize
  253. X} if
  254. Xcurrentdict /ledger known {
  255. X    ledger
  256. X    (ledger:    1224    792) getsize
  257. X} if
  258. Xcurrentdict /b5 known {
  259. X    b5
  260. X    (b5:         516    729) getsize
  261. X} if
  262. Xcurrentdict /b4 known {
  263. X    b4
  264. X    (b4:         729   1032) getsize
  265. X} if
  266. Xcurrentdict /a5 known {
  267. X    a5
  268. X    (a5:         420    595) getsize
  269. X} if
  270. Xcurrentdict /a4small known {
  271. X    a4small
  272. X    (a4small:    595    842) getsize
  273. X} if
  274. Xcurrentdict /a4 known {
  275. X    a4
  276. X    (a4:         595    842) getsize
  277. X} if
  278. Xcurrentdict /a3 known {
  279. X    a3
  280. X    (a3:         842   1190) getsize
  281. X} if
  282. Xcurrentdict /legal known {
  283. X    legal
  284. X    (legal:      612   1008) getsize
  285. X} if
  286. Xcurrentdict /letter known {
  287. X    letter
  288. X    (letter:     612    792) getsize
  289. X} if
  290. X
  291. X%  statusdict begin lettertray end    % modify for your "normal" output size
  292. X                                        % or the line below
  293. X%letter
  294. X
  295. X% print out the header
  296. X
  297. X/Courier findfont 12 scalefont setfont
  298. X/ycoord 500 def
  299. Xnewline
  300. X(Imageable area for) show
  301. Xnewline
  302. X(your personal printer with psf) show
  303. Xnewline
  304. X(            Physical    Lower    Upper) show
  305. Xnewline
  306. X(Size      width height   x  y    x    y) show
  307. Xnewline
  308. X(--------- ------------ ------- ---------) show
  309. X
  310. X% print each found paper size coordinates from the stack
  311. X
  312. X{    newline
  313. X    sendsize
  314. X    /nf nf 1 sub def
  315. X    nf 0 eq { exit } if
  316. X} loop
  317. X
  318. Xshowpage 
  319. Xpg restore
  320. END_OF_FILE
  321. if test 3336 -ne `wc -c <'getsizes.PS'`; then
  322.     echo shar: \"'getsizes.PS'\" unpacked with wrong size!
  323. fi
  324. # end of 'getsizes.PS'
  325. fi
  326. if test -f 'language.PSF' -a "${1}" != "-c" ; then 
  327.   echo shar: Will not clobber existing file \"'language.PSF'\"
  328. else
  329. echo shar: Extracting \"'language.PSF'\" \(7525 characters\)
  330. sed "s/^X//" >'language.PSF' <<'END_OF_FILE'
  331. X%%PsfStart
  332. X
  333. X$Id: language.PSF,v 3.2 1992/01/19 05:50:33 ajf Exp ajf $
  334. X
  335. X    WARNING: This file must be edited to cause valid selection
  336. X    =======     of postscript characters for non-English languages.
  337. X         The sample "Scandinavian" translation table is
  338. X         used for testing purposes only and will not generate
  339. X         correct character selections.  Read the comments in
  340. X         the "%%translate" section below to manually create
  341. X         a valid translation table and language character
  342. X         vector for the target language.
  343. X
  344. X    This is an example language startup file that illustrates
  345. X    encoding of a font vector to use Scandinavian characters. This
  346. X    file must be appended to the end of "psfprint.def" with
  347. X    
  348. X        cat psfprint.old.def language.PSF > psfprint.def
  349. X    
  350. X    The comments may remain in the final file, or may be removed as
  351. X    desired - they are ignored by psf and friends.
  352. X
  353. X    To set this code up for a different language, edit the lines
  354. X    prefixed with "%%font" and "%%translate". Then modify the
  355. X    section of postscript code following "ENCODE".
  356. X
  357. X    The first section of the code must start with "%%PsfStart" and
  358. X    terminate with %%PsfEnd. The information within this section
  359. X    contains new font defintion and character translation tables.
  360. X    This section may be empty, however the "%%PsfStart" and
  361. X    "%%PsfEnd" lines must exist.
  362. X
  363. X    This section is setup information processed by psf and psfbanner.
  364. X
  365. X    Any postscript code following the "%%PsfEnd" marker is copied to
  366. X    the printer as part of the postscript prologue.
  367. X
  368. X    The key words %%PsfStart, %%fontX %%translate %%copy %%PsfEnd
  369. X    must start in the first column of this file.
  370. X
  371. X    ((( It might be possible to adapt this file to re-encode an
  372. X    entire font for a different character set such as EBCDIC. Refer
  373. X    to Adobe's Blue Book program #17 for hints on how this might be
  374. X    accomplished. Entries for %%fontX would be needed, %%translate
  375. X    would not be needed, and the postscript code after %%PsfEnd
  376. X    would have to be replaced. )))
  377. X    --------------------------------------------------------------
  378. X
  379. X    Set up new language font names. Fonts in psf are numbered
  380. X    as 0..9, a..z. The "%%fontX" numbers (where 'X' represents the
  381. X    font number used by psf) reflect the font to be updated or
  382. X    added. If a font is not updated in the list below, the original
  383. X    font remains.
  384. X
  385. X    The following are the standard fonts known to psf:
  386. X
  387. X         # name                  # name
  388. X         - -------------------   - -------------------------
  389. X         0 Courier         1 Helvetica
  390. X         2 Times-Roman         3 AvantGarde-Book
  391. X         4 Bookman-Light     5 NewCenturySchlbk-Roman
  392. X         6 Palatino-Roman     7 Helvetical-Narrow
  393. X         8 Garamond-Light     9 Korinna-Regular
  394. X         a Helvetica-Condensed     b ZapfChancery-MediumItalic
  395. X
  396. X    This example REPLACES standard Courier (%%font0) to become a
  397. X    Scandinavian equivalent for the default Courier font and add a
  398. X    NEW font (%%fontc) to be the Scandinavian encoded version of
  399. X    Times-Roman. New fonts should be numbered starting from "c". DO
  400. X    NOT leave gaps when adding new font numbers, add c, d, e, ... in
  401. X    sequence.  
  402. X    
  403. X    New font definitions will appear with "psf -".
  404. X
  405. X    The format of the %%fontX lines must always follow the pattern
  406. X    below - the new names created must be for the base, italic,
  407. X    bold and bold-italic, in order. The new font names are
  408. X    arbitrary, however must match the names later in the ENCODE
  409. X    section.
  410. X
  411. X    font new base font    new italic font      new bold font    new bold-italic
  412. X      #   --------------   -------------------  ---------------- ---------------------
  413. X%%font0  Courier-S        Courier-Oblique-S    Courier-Bold-S   Courier-BoldOblique-S
  414. X%%fontc  Times-S          Times-I-S            Times-B-S        Times-BI-S
  415. X    ------------------------------------------------------------------
  416. X
  417. X    The following translates the letters from 'a' .. 't' to a series
  418. X    of characters that could be used in a Scandinavian language.
  419. X    Printing a file containing:
  420. X
  421. X        abcdefghijklmnopqrst
  422. X    
  423. X    causes each 'English' letter to be replaced by an arbitrary
  424. X    special 'Scandanavian' letter.
  425. X
  426. X    The translation table format is:
  427. X
  428. X                   <ascii text value> / <postscript value>
  429. X    e.g.:
  430. X           141/300  translates "a" to "/Oacute"
  431. X
  432. X                   where 141 = "a",    300 = "/Oacute"
  433. X
  434. X    The <ascii text value> is the octal value of a text character
  435. X    that actually appears in the text file. The <postscript value>
  436. X    is the octal value to which it is to be translated. This new
  437. X    value is set up in the "languagevec" array below.
  438. X
  439. X    On SysV unix, the <ascii text value>s are (may be?) determined
  440. X    from the ttymap(1) table for the target language.
  441. X
  442. X    Of course, this table is not "real", it is an example only -
  443. X    used for testing! Replace this with real translation
  444. X    information.
  445. X
  446. X%%translate 141/300 142/311 143/321 144/322 145/323 146/324 147/325 150/330 
  447. X%%translate 151/331 152/332 153/333 154/334 155/340 156/342 157/344 160/347
  448. X%%translate 161/360 162/362 163/364 164/367
  449. X    ----------------------------------------------------------------
  450. X
  451. X    An external file may be copied to the printer with "%%copy file"
  452. X    This file is inserted into the "prologue" code. It must be
  453. X    postscript.
  454. X
  455. X         %%copy /etc/some.file
  456. X
  457. X%%PsfEnd
  458. X
  459. X
  460. X%  Psf and psbanner add the following code to the Prologue
  461. X%
  462. X%  The following postscript code is from:
  463. X%       Adobe Postscript Language Tutorial and Cookbook
  464. X%       Blue book program 18, page 211.
  465. X%       Making small changes to encoding vectors
  466. X%
  467. X
  468. X/reencsmalldict 12 dict def
  469. X/ReEncodeSmall
  470. X   {reencsmalldict begin
  471. X      /newcodesandnames exch def
  472. X      /newfontname exch def
  473. X      /basefontname exch def
  474. X      /basefontdict basefontname findfont def
  475. X      /newfont basefontdict maxlength dict def
  476. X      basefontdict
  477. X      { exch dup /FID ne
  478. X         {dup /Encoding eq
  479. X            {   exch dup length array copy
  480. X                newfont 3 1 roll put }
  481. X            {   exch newfont 3 1 roll put }
  482. X            ifelse
  483. X         }
  484. X         {   pop pop   }
  485. X         ifelse
  486. X      } forall
  487. X      
  488. X      newfont /FontName newfontname put
  489. X      newcodesandnames aload pop
  490. X      
  491. X      newcodesandnames length 2 idiv
  492. X      {   newfont /Encoding get 3 1 roll put }
  493. X      repeat
  494. X         
  495. X      newfontname newfont definefont pop
  496. X      end
  497. X   } def
  498. X
  499. X% Select the additional characters needed for the desired language.
  500. X% "languagevec" below is set up as a Scandinavian character set
  501. X% assignment. Other languages will need a different selection.
  502. X
  503. X/languagevec [
  504. X   8#300 /Oacute
  505. X   8#311 /Adieresis
  506. X   8#321 /oacute
  507. X   8#322 /Ograve
  508. X   8#323 /Scaron
  509. X   8#324 /ograve
  510. X   8#325 /scaron
  511. X   8#330 /Edieresis
  512. X   8#331 /adieresis
  513. X   8#332 /edieresis
  514. X   8#333 /Odieresis
  515. X   8#334 /odieresis
  516. X   8#340 /Aacute
  517. X   8#342 /Aring
  518. X   8#344 /Zcaron
  519. X   8#347 /Eacute
  520. X   8#360 /aacute
  521. X   8#362 /aring
  522. X   8#364 /zcaron
  523. X   8#367 /eacute
  524. X   ] def
  525. X
  526. X% ENCODE the new fonts for Scandinavian.  Then new font name must
  527. X% have been defined in the "%%fontX" lines above.
  528. X%
  529. X% base font          new font name          reencode the new font
  530. X% -----------------  ---------------------  -------------------------
  531. X/Courier             /Courier-S             languagevec ReEncodeSmall
  532. X/Courier-Oblique     /Courier-Oblique-S     languagevec ReEncodeSmall
  533. X/Courier-Bold        /Courier-Bold-S        languagevec ReEncodeSmall
  534. X/Courier-BoldOblique /Courier-BoldOblique-S languagevec ReEncodeSmall
  535. X/Times-Roman         /Times-S               languagevec ReEncodeSmall
  536. X/Times-Italic        /Times-I-S             languagevec ReEncodeSmall
  537. X/Times-Bold          /Times-B-S             languagevec ReEncodeSmall
  538. X/Times-BoldItalic    /Times-BI-S            languagevec ReEncodeSmall
  539. END_OF_FILE
  540. if test 7525 -ne `wc -c <'language.PSF'`; then
  541.     echo shar: \"'language.PSF'\" unpacked with wrong size!
  542. fi
  543. # end of 'language.PSF'
  544. fi
  545. if test -f 'man/psfbs.1' -a "${1}" != "-c" ; then 
  546.   echo shar: Will not clobber existing file \"'man/psfbs.1'\"
  547. else
  548. echo shar: Extracting \"'man/psfbs.1'\" \(3529 characters\)
  549. sed "s/^X//" >'man/psfbs.1' <<'END_OF_FILE'
  550. X.\" $Id: psfbs.1,v 3.1 1991/11/27 06:10:44 ajf Exp ajf $
  551. X.TH PSFBS 1 ""
  552. X.SH NAME
  553. Xpsfbs \- postscript nroff backspace filter for use with psf
  554. X
  555. X.SH SYNOPSIS
  556. X.B psfbs
  557. X[
  558. X.B -i
  559. X] [
  560. X.B -f
  561. X] [
  562. X.B -l
  563. X.I n
  564. X] [
  565. X.B -r
  566. X.I n
  567. X]
  568. X.I file ... > out.fil
  569. X.nf
  570. X
  571. Xwhere     -i   = use italic font instead of underline
  572. X          -f   = document has formfeeds, ignore line count
  573. X          -l n = nroff generated "n" ine pages
  574. X                 (default = 66 lines)
  575. X          -r n = number of lines to remove (default = 3)
  576. X          file = input files (or stdin)
  577. X.fi
  578. X
  579. X.SH DESCRIPTION
  580. X
  581. X.I Psfbs
  582. Xis a filter that converts "backspaced text" generated by 
  583. X.I nroff
  584. Xinto underlined or bold text. It is primarily used
  585. Xto format
  586. X.I man
  587. Xpages, however it can be used to format documents
  588. Xgenerated with the
  589. X.I ms
  590. Xand
  591. X.I mm
  592. Xmacros.
  593. X
  594. XNormally,
  595. X.I psfbs
  596. Xis not used directly: the shell script
  597. X.I psfnroff
  598. Xis a more convenient interface for
  599. X.I nroff
  600. Xtext formatting.
  601. X
  602. XNroff'ed documents typically use 66 line pages.  Since
  603. X.I psf
  604. Xdefaults to 63 lines on Letter size paper (3 lines are unprintable), three
  605. Xblank lines are usually removed between nroff'ed pages.
  606. X
  607. X.SH EXAMPLES
  608. X
  609. XThe man page for "psf" man page could be printed "2-up" with:
  610. X
  611. X.nf
  612. X      nroff -man psf.1 | psfbs -r 3 | psf -2 | lp
  613. X
  614. Xor 1-up with with italic conversion
  615. X
  616. X      nroff -man psf.1 | psfbs -ir 3 | psf -2 | lp
  617. X.fi
  618. X
  619. X.SH OPTIONS
  620. X
  621. X.TP .9i
  622. X.B \-i
  623. XSince the text from
  624. X.I nroff
  625. Xusually substitutes underlines for
  626. Xitalics, you may use the -i option to regenerate the italic font.
  627. X
  628. X.RE
  629. X.TP .9i
  630. X.B \-f
  631. XIf the document uses form feeds for page separation, the -f option
  632. Xshould be specified.  Any line count specified by -l is ignored.
  633. X
  634. X.RE
  635. X.TP .9i
  636. X.B \-l n
  637. XThe -l option specifies the nominal number of lines generated by
  638. X.I nroff
  639. Xfor the page.  If the -l option is used, the -r option probably must
  640. Xbe specified also.
  641. X
  642. XIf "-l" is not specified, then 66 line nroff pages are assumed.
  643. X
  644. X.RE
  645. X.TP .9i
  646. X.B \-r n
  647. XThe -r option allows you to specify the number blank lines to be
  648. Xremoved between each page generated by nroff.
  649. XIf "-r" is not specified, then 3 blank lines are removed between pages.
  650. X
  651. XThe removed lines account for the "unprintable" top an bottom
  652. Xareas of the postscript page.
  653. X
  654. XLines may be removed by
  655. X.I psfbs
  656. Xor by
  657. X.I psf
  658. Xwhich also has a
  659. X.I -r
  660. Xoption.  If line removal is performed by
  661. X.I psf,
  662. Xthen the option
  663. X.B -r0
  664. Xshould be used with
  665. X.I psfbs
  666. Xto disable the removal of the 3 default blank lines.
  667. X
  668. X.SH PSFBS NOTES
  669. X
  670. X.I Psfbs
  671. Xconverts "backspaced text" generated by
  672. X.I nroff
  673. Xinto escape sequences
  674. Xthat can be used by psf to generate underlined or bold text.
  675. XIt simply scans for the "backspace" character and
  676. Xattempts determine if the backspace is used in the contex of an "underline"
  677. Xor "multi-strike boldface".  In some circumstances, it may not correctly
  678. Xdetect the print operation (for example, italic-bold is not recognized).
  679. X
  680. XThe conversion results in the following generated sequences that can
  681. Xbe recognized by
  682. X.I psf
  683. X(were ^E is <ctrl>E or the octal value \\005):
  684. X.nf
  685. X
  686. X        ^EB..text..^Eb   for bold
  687. X        ^EU..text..^Eu   for underline
  688. Xor
  689. X        ^EI..text..^Ei   for italics
  690. X
  691. X(italics instead of underline selected with -i option)
  692. X
  693. X.fi
  694. XThe logic cannot handle bold-underlined (nor italic-underlined).
  695. X
  696. X.SH BUGS
  697. X
  698. X.I Psfbs
  699. Xis not a full featured
  700. X.I nroff
  701. Xfilter. It is intended to process documents generated
  702. Xwith the
  703. X.I -man
  704. Xmacros. Formatting with other macros may be incorrectly handled.
  705. X
  706. X.SH SEE ALSO
  707. Xpsf psfman psfnroff psfdoub
  708. X
  709. X.SH AUTHOR
  710. X
  711. XTony Field.         tony@ajfcal.cuc.ab.ca
  712. END_OF_FILE
  713. if test 3529 -ne `wc -c <'man/psfbs.1'`; then
  714.     echo shar: \"'man/psfbs.1'\" unpacked with wrong size!
  715. fi
  716. # end of 'man/psfbs.1'
  717. fi
  718. if test -f 'man/psfbs.doc' -a "${1}" != "-c" ; then 
  719.   echo shar: Will not clobber existing file \"'man/psfbs.doc'\"
  720. else
  721. echo shar: Extracting \"'man/psfbs.doc'\" \(3824 characters\)
  722. sed "s/^X//" >'man/psfbs.doc' <<'END_OF_FILE'
  723. X
  724. X
  725. X
  726. X     PSFBS(1)               Unix System V              PSFBS(1)
  727. X
  728. X
  729. X
  730. X     NAME
  731. X      psfbs    - postscript nroff backspace filter for    use with psf
  732. X
  733. X
  734. X     SYNOPSIS
  735. X      psfbs    [ -i ] [ -f ] [    -l n ] [ -r n ]    file ... > out.fil
  736. X
  737. X      where        -i     = use italic font instead of underline
  738. X            -f     = document has    formfeeds, ignore line count
  739. X            -l n = nroff generated "n" ine pages
  740. X               (default = 66 lines)
  741. X            -r n = number of lines to remove (default =    3)
  742. X            file = input files (or stdin)
  743. X
  744. X
  745. X     DESCRIPTION
  746. X      Psfbs    is a filter that converts "backspaced text" generated
  747. X      by nroff into    underlined or bold text. It is primarily used
  748. X      to format man    pages, however it can be used to format
  749. X      documents generated with the ms and mm macros.
  750. X
  751. X      Normally, psfbs is not used directly:    the shell script
  752. X      psfnroff is a    more convenient    interface for nroff text
  753. X      formatting.
  754. X
  755. X      Nroff'ed documents typically use 66 line pages.  Since psf
  756. X      defaults to 63 lines on Letter size paper (3 lines are
  757. X      unprintable),    three blank lines are usually removed between
  758. X      nroff'ed pages.
  759. X
  760. X
  761. X     EXAMPLES
  762. X      The man page for "psf" man page could    be printed "2-up"
  763. X      with:
  764. X
  765. X        nroff -man psf.1 | psfbs -r 3 |    psf -2 | lp
  766. X
  767. X      or 1-up with with italic conversion
  768. X
  769. X        nroff -man psf.1 | psfbs -ir 3 | psf -2    | lp
  770. X
  771. X
  772. X     OPTIONS
  773. X      -i       Since the text from nroff usually substitutes
  774. X           underlines for italics, you may use the -i option
  775. X           to regenerate the italic font.
  776. X
  777. X
  778. X      -f       If the document uses    form feeds for page
  779. X           separation, the -f option should be specified.  Any
  780. X           line    count specified    by -l is ignored.
  781. X
  782. X
  783. X
  784. X
  785. X     Page 1                         (printed 1/18/92)
  786. X
  787. X
  788. X
  789. X
  790. X
  791. X
  792. X     PSFBS(1)               Unix System V              PSFBS(1)
  793. X
  794. X
  795. X
  796. X      -l n       The -l option specifies the nominal number of lines
  797. X           generated by    nroff for the page.  If    the -l option
  798. X           is used, the    -r option probably must    be specified
  799. X           also.
  800. X
  801. X           If "-l" is not specified, then 66 line nroff    pages
  802. X           are assumed.
  803. X
  804. X
  805. X      -r n       The -r option allows    you to specify the number
  806. X           blank lines to be removed between each page
  807. X           generated by    nroff.    If "-r"    is not specified, then
  808. X           3 blank lines are removed between pages.
  809. X
  810. X           The removed lines account for the "unprintable" top
  811. X           an bottom areas of the postscript page.
  812. X
  813. X           Lines may be    removed    by psfbs or by psf which also
  814. X           has a -r option.  If    line removal is    performed by
  815. X           psf,    then the option    -r0 should be used with    psfbs
  816. X           to disable the removal of the 3 default blank
  817. X           lines.
  818. X
  819. X
  820. X     PSFBS NOTES
  821. X      Psfbs    converts "backspaced text" generated by    nroff into
  822. X      escape sequences that    can be used by psf to generate
  823. X      underlined or    bold text.  It simply scans for    the
  824. X      "backspace" character    and attempts determine if the
  825. X      backspace is used in the contex of an    "underline" or
  826. X      "multi-strike    boldface".  In some circumstances, it may not
  827. X      correctly detect the print operation (for example, italic-
  828. X      bold is not recognized).
  829. X
  830. X      The conversion results in the    following generated sequences
  831. X      that can be recognized by psf    (were ^E is <ctrl>E or the
  832. X      octal    value \005):
  833. X
  834. X          ^EB..text..^Eb   for bold
  835. X          ^EU..text..^Eu   for underline
  836. X      or
  837. X          ^EI..text..^Ei   for italics
  838. X
  839. X      (italics instead of underline    selected with -i option)
  840. X
  841. X      The logic cannot handle bold-underlined (nor italic-
  842. X      underlined).
  843. X
  844. X
  845. X     BUGS
  846. X      Psfbs    is not a full featured nroff filter. It    is intended to
  847. X      process documents generated with the -man macros. Formatting
  848. X
  849. X
  850. X
  851. X     Page 2                         (printed 1/18/92)
  852. X
  853. X
  854. X
  855. X
  856. X
  857. X
  858. X     PSFBS(1)               Unix System V              PSFBS(1)
  859. X
  860. X
  861. X
  862. X      with other macros may    be incorrectly handled.
  863. X
  864. X
  865. X     SEE ALSO
  866. X      psf psfman psfnroff psfdoub
  867. X
  868. X
  869. X     AUTHOR
  870. X      Tony Field.          tony@ajfcal.cuc.ab.ca
  871. X
  872. X
  873. X
  874. X
  875. X
  876. X
  877. X
  878. X
  879. X
  880. X
  881. X
  882. X
  883. X
  884. X
  885. X
  886. X
  887. X
  888. X
  889. X
  890. X
  891. X
  892. X
  893. X
  894. X
  895. X
  896. X
  897. X
  898. X
  899. X
  900. X
  901. X
  902. X
  903. X
  904. X
  905. X
  906. X
  907. X
  908. X
  909. X
  910. X
  911. X
  912. X
  913. X
  914. X
  915. X
  916. X
  917. X     Page 3                         (printed 1/18/92)
  918. X
  919. X
  920. X
  921. END_OF_FILE
  922. if test 3824 -ne `wc -c <'man/psfbs.doc'`; then
  923.     echo shar: \"'man/psfbs.doc'\" unpacked with wrong size!
  924. fi
  925. # end of 'man/psfbs.doc'
  926. fi
  927. if test -f 'man/psfdoub.1' -a "${1}" != "-c" ; then 
  928.   echo shar: Will not clobber existing file \"'man/psfdoub.1'\"
  929. else
  930. echo shar: Extracting \"'man/psfdoub.1'\" \(3082 characters\)
  931. sed "s/^X//" >'man/psfdoub.1' <<'END_OF_FILE'
  932. X.\" $Id: psfdoub.1,v 3.1 1991/11/27 06:10:44 ajf Exp ajf $
  933. X.TH PSFDOUB 1 ""
  934. X.SH NAME
  935. Xpsfdoub \- print double sided (psf)
  936. X.SH SYNOPSIS
  937. X
  938. X.B psfdoub n
  939. X[
  940. X.B -u
  941. X.I f.def
  942. X] [
  943. X.B -v
  944. X]
  945. X.I file
  946. X.nf
  947. X
  948. Xwhere   n  is the number 1, 2, or 3
  949. X           1 = print first side
  950. X           2 = print second side
  951. X           3 = print both sides (must have second print tray)
  952. X          -r = reverse order print
  953. X    -u f.def = name of .def file to use
  954. X        file = input file (default: psfbook.psd)
  955. X.fi
  956. X
  957. X.SH DESCRIPTION
  958. X
  959. XIf the postscript filter 
  960. X.I psf
  961. Xis used with the -d (double sided)
  962. Xoption, the output file
  963. X.I psfbook.psd
  964. Xmust be passed to 
  965. X.I psfdoub
  966. Xto print
  967. Xthe generated file in "double sided" format.  (See NOTE below.)
  968. X
  969. XThe printing is done in two passes:  first to print side one,
  970. Xsecond to print side two.
  971. X
  972. XThe general sequence of commands is be:
  973. X
  974. X.nf
  975. X        psf -d my.file 
  976. X        psfdoub -1 psfbook.psd | lp
  977. X                   <-- re-feed the paper for 2nd pass
  978. X        psfdoub -2 psfbook.psd | lp
  979. X.fi
  980. X
  981. X.I Psf
  982. Xgenerates the intermediate file
  983. X.I psfbook.psd.
  984. XThe first invocation of 
  985. X.I psfdoub
  986. Xwith the -1 option prints only the front side
  987. Xof the pages.  After the printing is complete,  the paper must be
  988. Xre-fed into the print hopper.  The psfdoub -2 command is then issued to print
  989. Xon the back side of the pages.
  990. X
  991. XIf 
  992. X.I psfdoub
  993. Xis used with the -3 option, the front sides are printed.  Automatically,
  994. Xthe printer is switched to accept input from the alternate print tray.
  995. XAs soon as the alternate print tray is loaded, the second side is printed.
  996. XE.g.:
  997. X.nf
  998. X        psf -d my.file 
  999. X        psfdoub -3 psfbook.psd | lp
  1000. X.fi
  1001. X
  1002. XThe -3 option may be used only if the printer has two print trays.
  1003. X
  1004. X.SH OPTIONS
  1005. X.TP
  1006. X.B -123
  1007. Xsets the desired page size for printing.  See above.
  1008. X
  1009. X.TP
  1010. X.B -r
  1011. Xcauses the pages to be printed in reverse order.
  1012. X
  1013. X.TP
  1014. X.B -u f.def
  1015. Xcauses the specified printer definition file to be used rather
  1016. Xthat 
  1017. X.I psfprint.def.
  1018. X
  1019. X.TP
  1020. X.B file
  1021. Xis the name of the file to be processed.  The file name
  1022. Xgenerated by
  1023. X.I psf
  1024. Xis
  1025. X.I psfbook.psd.
  1026. XIf an input file name is not provided, the
  1027. X.I psfbook.psd
  1028. Xis assumed.
  1029. X
  1030. X.SH NOTE
  1031. X
  1032. XIf 
  1033. X.I psf
  1034. Xwas compiled with the "-DHOPPER" option and the postscript printer
  1035. Xhas at least two paper hoppers, 
  1036. X.I psf
  1037. Xautomatically calls
  1038. X.I psfdoub
  1039. Xto perform
  1040. Xdouble sided printing. Manual invocation of 
  1041. X.I psfdoub
  1042. Xis not necessary.
  1043. X
  1044. XIf 
  1045. X.I psf
  1046. Xwas not compiled with "-DHOPPER" or if the postscript printer does
  1047. Xnot have at least two paper hoppers, then
  1048. X.I psfdoub
  1049. Xmust be used as described
  1050. Xabove.
  1051. X
  1052. XThe use of option "-3" assumes that 
  1053. X.I psf
  1054. Xwas compiled 
  1055. X.B without
  1056. Xthe "-DHOPPER"
  1057. Xoption, however the printer does, in fact, have at least two paper
  1058. Xhoppers.
  1059. X
  1060. XExamine shell script
  1061. X.I psfdouble
  1062. Xas an example on setting up suitable shell scripts
  1063. Xfor double sided printing.
  1064. X
  1065. X.I Psfdoub is also used by
  1066. X.I psf
  1067. Xfor reverse order printing.
  1068. X
  1069. X.SH BUGS
  1070. XDouble sided reverse ordered printing is not supported.
  1071. X
  1072. X.SH FILES
  1073. X.nf
  1074. Xpsfprint.def - printer definition file
  1075. Xpsfbook.psd  - file to be processed by psfdoub
  1076. X.fi
  1077. X
  1078. X.SH SEE ALSO
  1079. X
  1080. Xpsf psfmbox psfmail psfbs psfman psfnroff
  1081. END_OF_FILE
  1082. if test 3082 -ne `wc -c <'man/psfdoub.1'`; then
  1083.     echo shar: \"'man/psfdoub.1'\" unpacked with wrong size!
  1084. fi
  1085. # end of 'man/psfdoub.1'
  1086. fi
  1087. if test -f 'man/psfdoub.doc' -a "${1}" != "-c" ; then 
  1088.   echo shar: Will not clobber existing file \"'man/psfdoub.doc'\"
  1089. else
  1090. echo shar: Extracting \"'man/psfdoub.doc'\" \(3198 characters\)
  1091. sed "s/^X//" >'man/psfdoub.doc' <<'END_OF_FILE'
  1092. X
  1093. X
  1094. X
  1095. X     PSFDOUB(1)               Unix System V            PSFDOUB(1)
  1096. X
  1097. X
  1098. X
  1099. X     NAME
  1100. X      psfdoub - print double sided (psf)
  1101. X
  1102. X     SYNOPSIS
  1103. X      psfdoub n [ -u f.def ] [ -v ]    file
  1104. X
  1105. X      where      n  is    the number 1, 2, or 3
  1106. X             1 = print first side
  1107. X             2 = print second side
  1108. X             3 = print both sides (must    have second print tray)
  1109. X            -r = reverse order print
  1110. X          -u f.def = name of .def file to use
  1111. X          file = input file (default: psfbook.psd)
  1112. X
  1113. X
  1114. X     DESCRIPTION
  1115. X      If the postscript filter psf is used with the    -d (double
  1116. X      sided) option, the output file psfbook.psd must be passed to
  1117. X      psfdoub to print the generated file in "double sided"
  1118. X      format.  (See    NOTE below.)
  1119. X
  1120. X      The printing is done in two passes:  first to    print side
  1121. X      one, second to print side two.
  1122. X
  1123. X      The general sequence of commands is be:
  1124. X
  1125. X          psf -d my.file
  1126. X          psfdoub -1 psfbook.psd | lp
  1127. X                 <-- re-feed the paper for 2nd pass
  1128. X          psfdoub -2 psfbook.psd | lp
  1129. X
  1130. X      Psf generates    the intermediate file psfbook.psd. The first
  1131. X      invocation of    psfdoub    with the -1 option prints only the
  1132. X      front    side of    the pages.  After the printing is complete,
  1133. X      the paper must be re-fed into    the print hopper.  The psfdoub
  1134. X      -2 command is    then issued to print on    the back side of the
  1135. X      pages.
  1136. X
  1137. X      If psfdoub is    used with the -3 option, the front sides are
  1138. X      printed.  Automatically, the printer is switched to accept
  1139. X      input    from the alternate print tray.    As soon    as the
  1140. X      alternate print tray is loaded, the second side is printed.
  1141. X      E.g.:
  1142. X          psf -d my.file
  1143. X          psfdoub -3 psfbook.psd | lp
  1144. X
  1145. X      The -3 option    may be used only if the    printer    has two    print
  1146. X      trays.
  1147. X
  1148. X
  1149. X     OPTIONS
  1150. X      -123 sets the    desired    page size for printing.     See above.
  1151. X
  1152. X
  1153. X
  1154. X     Page 1                         (printed 1/18/92)
  1155. X
  1156. X
  1157. X
  1158. X
  1159. X
  1160. X
  1161. X     PSFDOUB(1)               Unix System V            PSFDOUB(1)
  1162. X
  1163. X
  1164. X
  1165. X      -r   causes the pages    to be printed in reverse order.
  1166. X
  1167. X
  1168. X      -u f.def
  1169. X           causes the specified printer definition file to be used
  1170. X           rather that psfprint.def.
  1171. X
  1172. X
  1173. X      file is the name of the file to be processed.     The file name
  1174. X           generated by psf    is psfbook.psd.    If an input file name
  1175. X           is not provided,    the psfbook.psd    is assumed.
  1176. X
  1177. X
  1178. X     NOTE
  1179. X      If psf was compiled with the "-DHOPPER" option and the
  1180. X      postscript printer has at least two paper hoppers, psf
  1181. X      automatically    calls psfdoub to perform double    sided
  1182. X      printing. Manual invocation of psfdoub is not    necessary.
  1183. X
  1184. X      If psf was not compiled with "-DHOPPER" or if    the postscript
  1185. X      printer does not have    at least two paper hoppers, then
  1186. X      psfdoub must be used as described above.
  1187. X
  1188. X      The use of option "-3" assumes that psf was compiled without
  1189. X      the "-DHOPPER" option, however the printer does, in fact,
  1190. X      have at least    two paper hoppers.
  1191. X
  1192. X      Examine shell    script psfdouble as an example on setting up
  1193. X      suitable shell scripts for double sided printing.
  1194. X
  1195. X      Psfdoub is also used by psf for reverse order    printing.
  1196. X
  1197. X
  1198. X     BUGS
  1199. X      Double sided reverse ordered printing    is not supported.
  1200. X
  1201. X
  1202. X     FILES
  1203. X      psfprint.def - printer definition file
  1204. X      psfbook.psd  - file to be processed by psfdoub
  1205. X
  1206. X
  1207. X     SEE ALSO
  1208. X      psf psfmbox psfmail psfbs psfman psfnroff
  1209. X
  1210. X
  1211. X
  1212. X
  1213. X
  1214. X
  1215. X
  1216. X
  1217. X
  1218. X
  1219. X
  1220. X     Page 2                         (printed 1/18/92)
  1221. X
  1222. X
  1223. X
  1224. END_OF_FILE
  1225. if test 3198 -ne `wc -c <'man/psfdoub.doc'`; then
  1226.     echo shar: \"'man/psfdoub.doc'\" unpacked with wrong size!
  1227. fi
  1228. # end of 'man/psfdoub.doc'
  1229. fi
  1230. if test -f 'psfbs.c' -a "${1}" != "-c" ; then 
  1231.   echo shar: Will not clobber existing file \"'psfbs.c'\"
  1232. else
  1233. echo shar: Extracting \"'psfbs.c'\" \(6098 characters\)
  1234. sed "s/^X//" >'psfbs.c' <<'END_OF_FILE'
  1235. X/* ta=4 */
  1236. X/****************************************************************************
  1237. X*                        p s f b s . c                                          *
  1238. X*                                                                            *
  1239. X*    postscript filter for nroff'ed text                                        *
  1240. X*                                                                            *
  1241. X*    Translate backspaces in nroff documents to either BOLD or UNDERLINE        *
  1242. X*    for psf usage                                                            *
  1243. X*                                                                            *
  1244. X*    Tony Field.       tony@ajfcal.cuc.ab.ca                                    *
  1245. X****************************************************************************/
  1246. X/*
  1247. X * $Id: psfbs.c,v 3.2 1992/01/19 05:50:33 ajf Exp ajf $
  1248. X *
  1249. X */
  1250. X
  1251. X/*    For each line in of input text, scan for backspaces.  Determine if
  1252. X    the operation is an underline (i.e. the preceeding character is
  1253. X    the "_") or if it is a bolding (the character after the underscore
  1254. X    is the same as the preceeding.
  1255. X    
  1256. X    Generate the sequence \005B..text..\005b   for bold
  1257. X                          \005U..text..\005u   for underline
  1258. X                          \005I..text..\005i   for italics
  1259. X
  1260. X    Since the text from nroff does not have a decent way of identifying
  1261. X    italics, you may make the decision to generate the "italic" or 
  1262. X    "underline" escape sequence  whenever an underline is detected in
  1263. X    the output.  Italic fonts look nicer than the underlines 2-up.
  1264. X
  1265. X    The logic cannot handle bold-underlined (nor italic-underlined).
  1266. X    This could be done with a bit of extra logic to manipulate bits
  1267. X    in the "how" vector.
  1268. X
  1269. X    For nroff, remove three blank lines between pages (an nroff'ed
  1270. X        document, letter size, has 66 lines.  the postscript
  1271. X        printer must see 63 lines.)   Assume that nroff is consistent.
  1272. X        If "point size" adjustments are made (e.g. some documents
  1273. X        originally intended for troff), then lines per page may not
  1274. X        be consistent.
  1275. X        
  1276. X*/
  1277. X
  1278. X#include <stdio.h>
  1279. X#include <string.h>
  1280. X#include "psf.h"
  1281. X#include "patchlevel.h"
  1282. X
  1283. Xchar    *pgmname;
  1284. XFILE    *outfp;
  1285. X
  1286. Xmain (argc, argv)
  1287. Xint        argc;
  1288. Xchar    *argv[];
  1289. X{    int        i, c;
  1290. X    int        nroff_lines = 66;
  1291. X    int        remove = 3;
  1292. X    int        count_lines = 1;
  1293. X    char    *underline_on, *underline_off;
  1294. X    extern char *optarg;
  1295. X    extern int    optind, getopt();
  1296. X    FILE    *input_fp;
  1297. X
  1298. X    outfp = stdout;
  1299. X    pgmname = argv[0];
  1300. X    underline_on  = BEGIN_UNDERLINE;
  1301. X    underline_off = END_UNDERLINE;
  1302. X
  1303. X    if (strcmp (argv[1], "-") == 0)
  1304. X        usage();
  1305. X    while ((c = getopt(argc, argv, "ifr:l:-")) != -1)
  1306. X    {    switch (c)
  1307. X        {
  1308. X        case 'i':
  1309. X            underline_on  = BEGIN_ITALICS;
  1310. X            underline_off = END_ITALICS;
  1311. X            break;
  1312. X        
  1313. X        case 'l':
  1314. X            nroff_lines = atoi (optarg);
  1315. X            break;
  1316. X            
  1317. X        case 'r':
  1318. X            remove = atoi (optarg);
  1319. X            break;
  1320. X            
  1321. X        case 'f':
  1322. X            count_lines = 0;
  1323. X            break;
  1324. X            
  1325. X        default:
  1326. X            usage ();
  1327. X        }
  1328. X    }
  1329. X    
  1330. X    if (optind >= argc)
  1331. X    {    input_fp = stdin;
  1332. X        print_file (input_fp, nroff_lines, remove, underline_on, underline_off, count_lines);
  1333. X    }
  1334. X    else
  1335. X    {
  1336. X        for (i = 0 ;  optind < argc;  optind++)
  1337. X        {    if ((input_fp = fopen (argv[optind], "r")) == NULL)
  1338. X            {    fprintf (stderr, "%s: File %s not found\n", pgmname, argv[optind]);
  1339. X            }
  1340. X            else
  1341. X            {    if (i)
  1342. X                    send ("\f");
  1343. X                print_file (input_fp, nroff_lines, remove, underline_on, underline_off, count_lines);
  1344. X                fclose (input_fp);
  1345. X                i++;
  1346. X            }
  1347. X        }
  1348. X    }
  1349. X    exit (0);
  1350. X        
  1351. X}
  1352. X
  1353. Xprint_file (fp, nroff_lines, remove, underline_on, underline_off, count_lines)
  1354. XFILE    *fp;
  1355. Xint        nroff_lines;
  1356. Xint        remove;
  1357. Xint        count_lines;
  1358. Xchar    *underline_on, *underline_off;
  1359. X{
  1360. X    int        c, n, i;
  1361. X    int        how[401];
  1362. X    char    line[401];
  1363. X    int        nroff_count;
  1364. X
  1365. X    nroff_count = n = 0;
  1366. X    
  1367. X    clear (line, how, 400);
  1368. X    while (( c = fgetc (fp)) != EOF)
  1369. X    {
  1370. X        if (c == '\033')            /* if ^[ (real ESCAPE character), then handle (sort of) */
  1371. X        {    if ((c = fgetc (fp)) == EOF)
  1372. X                break;
  1373. X            if (c == '9')        /*    1/2 line space fwd                */
  1374. X            {    fputc (ESCAPE, outfp);
  1375. X                fputc ('+', outfp);
  1376. X                nroff_count += 5;
  1377. X                continue;
  1378. X            }
  1379. X            else if (c == '8')        /*    1/2 line space back            */
  1380. X            {    fputc (ESCAPE, outfp);
  1381. X                fputc ('-', outfp);
  1382. X                nroff_count -= 5;
  1383. X                continue;
  1384. X            }
  1385. X            else
  1386. X            {    /*    don't know what to do with it */
  1387. X                continue;
  1388. X            }
  1389. X        }
  1390. X            
  1391. X        else if (c == '\b')
  1392. X            n--;
  1393. X        else if (c == '\n')
  1394. X        {    if (count_lines)
  1395. X            {    /*    remove 3 blank lines between pages
  1396. X                    1 from beginning of page,
  1397. X                    2 from end of page.
  1398. X                */
  1399. X                nroff_count = (nroff_count + 10) % (nroff_lines * 10);
  1400. X                if (nroff_count < 20  ||  nroff_count > (nroff_lines - (remove-1)) * 10)
  1401. X                    continue;
  1402. X            }
  1403. X            how[n] = 0;
  1404. X            line[n] = 0;
  1405. X            for (i = 0;  i <= n;  i++)
  1406. X            {
  1407. X                if (how[i])
  1408. X                {    /*    either bold or underlined see if previous char
  1409. X                        is not escaped - indicates the beginning of 
  1410. X                        an escape sequence.  may need to terminate
  1411. X                        previous sequence first (e.g. bold followed
  1412. X                        by underlined).
  1413. X                    */
  1414. X                    if (i > 0  &&  how[i-1]  &&  (how[i] != how[i-1]))
  1415. X                    {    if (how[i-1] == 1)
  1416. X                            send (END_BOLD);
  1417. X                        else
  1418. X                            send (underline_off);
  1419. X                    }
  1420. X                    if (how[i] == 1  &&  (i == 0  ||  how[i-1] != 1))
  1421. X                        send (BEGIN_BOLD);
  1422. X                    else if (how[i] == 2  &&  (i == 0  ||  how[i-1] != 2))
  1423. X                        send (underline_on);
  1424. X                }
  1425. X                else    /* zero means just a character, unmodified */
  1426. X                {    /* are we at the end of an escape sequence? */
  1427. X                    if (i > 0)
  1428. X                    {    if (how[i-1] == 1)
  1429. X                            send (END_BOLD);
  1430. X                        else if (how[i-1] == 2)
  1431. X                            send (underline_off);
  1432. X                    }
  1433. X                }
  1434. X                if (line[i])
  1435. X                    fputc (line[i], outfp);
  1436. X            }
  1437. X            fputc ('\n', outfp);    
  1438. X            clear (line, how, n);
  1439. X            n = 0;
  1440. X        }
  1441. X        else
  1442. X        {    if (line[n])
  1443. X            {    if (line[n] == c)        /* same character?        */
  1444. X                    how[n] = 1;            /*    yes:    bold        */
  1445. X                else
  1446. X                    how[n] = 2;            /*    no:        underline    */
  1447. X            }
  1448. X            if (line[n] == 0 || c != '_')
  1449. X                line[n] = c;
  1450. X            n++;
  1451. X        }
  1452. X    }
  1453. X}
  1454. X
  1455. Xclear (line, how, n)
  1456. Xchar    *line;
  1457. Xint        *how;
  1458. Xint        n;
  1459. X{
  1460. X    int        i;
  1461. X    
  1462. X    for (i  = 0;  i <= n;  i++)
  1463. X    {    line[i] = '\0';
  1464. X        how[i] = 0;
  1465. X    }
  1466. X}
  1467. X
  1468. Xsend (s)
  1469. Xchar    *s;
  1470. X{
  1471. X    while (*s)
  1472. X        fputc (*s++, outfp);
  1473. X}
  1474. X
  1475. Xusage ()
  1476. X{
  1477. X    fprintf (stderr, "Usage:   psfbs [-i] [ -f ] [ -l n ] [ -r n ] file ... >out.file\n");
  1478. X    fprintf (stderr, " where          -i   = use italics in lieu of underline\n");
  1479. X    fprintf (stderr, "                -f   = document has form feeds, ignore line count\n");
  1480. X    fprintf (stderr, "                -l n = make n line nroff'ed documents fit\n");
  1481. X    fprintf (stderr, "                -r n = number of blank lines to remove\n");
  1482. X    fprintf (stderr, "                file = input files (or stdin)\n");
  1483. X    exit (0);    
  1484. X}
  1485. END_OF_FILE
  1486. if test 6098 -ne `wc -c <'psfbs.c'`; then
  1487.     echo shar: \"'psfbs.c'\" unpacked with wrong size!
  1488. fi
  1489. # end of 'psfbs.c'
  1490. fi
  1491. if test -f 'psfmail.c' -a "${1}" != "-c" ; then 
  1492.   echo shar: Will not clobber existing file \"'psfmail.c'\"
  1493. else
  1494. echo shar: Extracting \"'psfmail.c'\" \(6468 characters\)
  1495. sed "s/^X//" >'psfmail.c' <<'END_OF_FILE'
  1496. X/* ta=4 */
  1497. X/****************************************************************************
  1498. X*                        p s f m a i l . c                                    *
  1499. X*                                                                            *
  1500. X*    postscript mail filter                                                    *
  1501. X*                                                                            *
  1502. X*    very simple mail filter to print name and subject in bold letters        *
  1503. X*    for psf usage.  Generates escape sequences that psf can understand.        *
  1504. X*    Modify the code if you wish to have various headers ignored for print.    *
  1505. X*                                                                            *
  1506. X*    Tony Field.       tony@ajfcal.cuc.ab.ca                                    *
  1507. X****************************************************************************/
  1508. X/*
  1509. X * $Id: psfmail.c,v 3.2 1992/01/19 05:50:33 ajf Exp ajf $
  1510. X *
  1511. X*/
  1512. X
  1513. X#include <stdio.h>
  1514. X#include <string.h>
  1515. X#include <ctype.h>
  1516. X#include "patchlevel.h"
  1517. X#include "psf.h"
  1518. X
  1519. X#define MAX_C        62            /*    max char wrap point on mail header line    */
  1520. X
  1521. Xchar    *pgmname;
  1522. X
  1523. XFILE    *outfp;
  1524. X
  1525. Xmain (argc, argv)
  1526. Xint        argc;
  1527. Xchar    *argv[];
  1528. X{
  1529. X    int        ignore_garbage, i;
  1530. X    extern char *optarg;
  1531. X    extern int    optind;
  1532. X    FILE    *input_fp;
  1533. X
  1534. X    outfp = stdout;
  1535. X    pgmname = argv[0];    
  1536. X    ignore_garbage = 1;
  1537. X    if (strcmp (argv[1], "-") == 0)
  1538. X        usage();
  1539. X    while ((i = getopt(argc, argv, "s-")) != -1)
  1540. X    {    switch (i)
  1541. X        {
  1542. X        case 's':
  1543. X            ignore_garbage = 0;        /*    print all headers    */
  1544. X            break;
  1545. X
  1546. X        default:
  1547. X            usage ();
  1548. X        }
  1549. X    }
  1550. X    if (optind >= argc)
  1551. X    {    input_fp = stdin;
  1552. X        print_file (input_fp, ignore_garbage);
  1553. X    }
  1554. X    else
  1555. X    {
  1556. X        for ( i = 0;  optind < argc;  optind++)
  1557. X        {    if ((input_fp = fopen (argv[optind], "r")) == NULL)
  1558. X            {    fprintf (stderr, "%s: File %s not found\n", pgmname, argv[optind]);
  1559. X            }
  1560. X            else
  1561. X            {    if (i)
  1562. X                    send ("\f");
  1563. X                print_file (input_fp, ignore_garbage);
  1564. X                fclose (input_fp);
  1565. X                i++;
  1566. X            }
  1567. X        }
  1568. X    }
  1569. X    exit (0);
  1570. X}
  1571. X
  1572. Xprint_file (fp, ignore_garbage)
  1573. XFILE *fp;
  1574. Xint     ignore_garbage;
  1575. X{
  1576. X    char    line[900], first[100], tail[800], *strchr();
  1577. X    int        last_char, header, garbage;
  1578. X
  1579. X    header = garbage = 0;
  1580. X    while (fgets (line, 999, fp)  != NULL)
  1581. X    {
  1582. Xnewmail:
  1583. X        last_char = split (line, first, tail);
  1584. X
  1585. X        /*    The following headers will be ignored during printing    */
  1586. X        
  1587. X        if (ignore_garbage 
  1588. X            &&  (strcmp (first, "Distribution:"  ) == 0
  1589. X            ||   strcmp (first, "Keywords:"      ) == 0
  1590. X            ||   strcmp (first, "Lines:"         ) == 0
  1591. X            ||   strcmp (first, "Message-ID:"    ) == 0
  1592. X            ||   strcmp (first, "Message-Id:"    ) == 0
  1593. X            ||   strcmp (first, "News-Path:"     ) == 0
  1594. X            ||   strcmp (first, "Path:"          ) == 0
  1595. X            ||   strcmp (first, "Posted:"        ) == 0
  1596. X            ||   strcmp (first, "Received:"      ) == 0
  1597. X            ||   strcmp (first, "References:"    ) == 0
  1598. X            ||   strcmp (first, "Sender:"        ) == 0
  1599. X            ||   strcmp (first, "Status:"        ) == 0
  1600. X            ||   strncmp(first, "X-",          2 ) == 0))
  1601. X        {    garbage = 1;
  1602. X        }
  1603. X        else if (strcmp (first, "From") == 0)
  1604. X        {    printclean (first, tail);
  1605. X            garbage = 0;
  1606. X        }
  1607. X        else if (strcmp (first, "From:") == 0
  1608. X                ||  strcmp (first, "Reply-To:") == 0
  1609. X                ||  strcmp (first, "To:") == 0)
  1610. X        {    header = 1;
  1611. X            if ((strchr (tail, '(') == NULL)  &&  (strchr (tail, '<') == NULL))
  1612. X                printbold (first, tail);
  1613. X            else
  1614. X                printname (first, tail);
  1615. X            garbage = 0;
  1616. X        }
  1617. X        else if (strcmp (first, "Bcc:") == 0 ||  strcmp (first, "Cc:") == 0)
  1618. X        {    header = 1;
  1619. X            printname (first, tail);
  1620. X            garbage = 0;
  1621. X        }
  1622. X        else if (strcmp (first, "Subject:") == 0)
  1623. X        {    printsubject (first, tail);
  1624. X            garbage = 0;
  1625. X        }
  1626. X        else if (last_char == ':')
  1627. X        {
  1628. X            header = 1;
  1629. X            printclean (first, tail);
  1630. X            garbage = 0;
  1631. X        }
  1632. X        else if (empty (line))
  1633. X        {    
  1634. X            send ("\n");
  1635. X            while (fgets (line, 999, fp) != NULL)
  1636. X            {    if (strncmp (line, "From ", 5) == 0
  1637. X                    &&  (strchr (line, ':') < strrchr (line, ':')))
  1638. X                {    send ("\f");
  1639. X                    goto newmail;    /* goto's considered harmful since 1964 */
  1640. X                }
  1641. X                printf ("%s", line);
  1642. X            }
  1643. X            break;
  1644. X        }
  1645. X        else if (garbage == 0)
  1646. X            printclean (" ", line);
  1647. X    }
  1648. X}
  1649. X
  1650. Xprintclean (first, tail)
  1651. Xchar    *first, *tail;
  1652. X{
  1653. X    printf ("%-14s", first);
  1654. X    printlong (tail);
  1655. X}
  1656. X
  1657. Xprintlong (tail)
  1658. Xchar    *tail;
  1659. X{    char    *c;
  1660. X    int        marks[100], nmarks, i, j, nchar;
  1661. X
  1662. X    /*    locate all marks that can be use for a line break     */
  1663. X
  1664. X    marks[0] = 0;
  1665. X    marks[1] = 0;
  1666. X    c = tail;
  1667. X    for ( i = nchar = 0, nmarks = 1;  nmarks < 100;  i++, c++, nchar++)
  1668. X    {
  1669. X        if (*c == '!'  ||  *c == ' ' ||  *c == '<'  
  1670. X            ||  *c == '('  ||  *c == '\0')
  1671. X        {    if (nchar < MAX_C)
  1672. X                marks[nmarks] = i;
  1673. X            else
  1674. X            {    nchar = i - marks[nmarks];
  1675. X                marks[++nmarks] = i;
  1676. X            }
  1677. X            if (*c == '\0')
  1678. X                break;
  1679. X        }
  1680. X    }
  1681. X    marks[nmarks] = i;
  1682. X    for (i = 0;  i < nmarks;  i++)
  1683. X    {
  1684. X        if (i)
  1685. X            printf ("%-14s", " ");
  1686. X        for (j = marks[i];  j < marks[i+1];  j++)
  1687. X            fputc (tail[j], outfp);
  1688. X        fputc ('\n', outfp);
  1689. X    }
  1690. X}
  1691. X
  1692. Xprintsubject (first, tail)
  1693. Xchar    *first, *tail;
  1694. X{
  1695. X    printf ("%-14s", first);
  1696. X    send (BEGIN_SUBJECT);
  1697. X    send (tail);
  1698. X    send (END_SUBJECT);
  1699. X    send ("\n");
  1700. X}
  1701. X
  1702. Xprintbold (first, tail)
  1703. Xchar    *first, *tail;
  1704. X{
  1705. X    printf ("%-14s", first);
  1706. X    send (BEGIN_BOLD);
  1707. X    printlong (tail);
  1708. X    send (END_BOLD);    
  1709. X}
  1710. X
  1711. Xprintname (first, tail)
  1712. Xchar    *first, *tail;
  1713. X{
  1714. X    printf ("%-14s", first);
  1715. X
  1716. X    if (strchr (tail, '<') != NULL)
  1717. X    {    /*    address syntax "name <address> stuff" */
  1718. X        send (BEGIN_NAME);
  1719. X        while (*tail != '<')
  1720. X            fputc (*tail++, outfp);
  1721. X        send (END_NAME);
  1722. X        fputc (*tail++, outfp);
  1723. X        while (*tail)
  1724. X        {    fputc (*tail, outfp);
  1725. X            if (*tail++ == '>')
  1726. X            {    if (*tail)
  1727. X                {    send (BEGIN_NAME);
  1728. X                    while (*tail)
  1729. X                        fputc (*tail++, outfp);
  1730. X                    send (END_NAME);
  1731. X                }
  1732. X            }
  1733. X        }
  1734. X    }
  1735. X    else
  1736. X    {    /*    address syntax "address (name)" */
  1737. X        while (*tail  &&  *tail != '(')
  1738. X            fputc (*tail++, outfp);
  1739. X        if (*tail)
  1740. X        {    send (BEGIN_NAME);
  1741. X            fputc (*tail++, outfp);
  1742. X            while (*tail)
  1743. X            {    fputc (*tail, outfp);
  1744. X                if (*tail++ == ')')
  1745. X                {    send (END_NAME);
  1746. X                    while (*tail)
  1747. X                        fputc (*tail++, outfp);
  1748. X                    fputc ('\n', outfp);
  1749. X                    return;
  1750. X                }
  1751. X            }
  1752. X        }
  1753. X    }
  1754. X    fputc ('\n', outfp);
  1755. X}
  1756. X
  1757. Xsend (s)
  1758. Xchar    *s;
  1759. X{
  1760. X    while (*s)
  1761. X        fputc (*s++, outfp);
  1762. X}
  1763. X
  1764. Xempty (s)
  1765. Xchar    *s;
  1766. X{    while (*s  &&  *s <= ' ')
  1767. X        s++;
  1768. X    if (*s)
  1769. X        return (0);
  1770. X    else
  1771. X        return (1);
  1772. X}
  1773. X
  1774. Xsplit (line, first, tail)
  1775. Xchar    *line;            /*    input:    full input line            */
  1776. Xchar    *first;            /*    return:    first word of line        */
  1777. Xchar    *tail;            /*    return:    all others words of line*/
  1778. X{    int    last;
  1779. X
  1780. X    last = 0;
  1781. X    while (*line  &&  isspace (*line) == 0)
  1782. X    {    last = *line;
  1783. X        *first++ = *line++;
  1784. X    }
  1785. X    *first = '\0';
  1786. X    
  1787. X    while (*line  &&  isspace (*line))
  1788. X        line++;
  1789. X    
  1790. X    while (*line  &&  *line != '\n')
  1791. X        *tail++ = *line++;
  1792. X    *tail = '\0';
  1793. X    *line = '\0';
  1794. X    return (last);
  1795. X}
  1796. X
  1797. Xusage ()
  1798. X{
  1799. X    fprintf (stderr, "Usage:   psfmail [-s] files... >out.file\n");
  1800. X    fprintf (stderr, " where            -s  = show all header lines\n");
  1801. X    fprintf (stderr, "                files = input files (or stdin)\n");
  1802. X    exit (0);    
  1803. X}
  1804. END_OF_FILE
  1805. if test 6468 -ne `wc -c <'psfmail.c'`; then
  1806.     echo shar: \"'psfmail.c'\" unpacked with wrong size!
  1807. fi
  1808. # end of 'psfmail.c'
  1809. fi
  1810. if test -f 'selectdef.c' -a "${1}" != "-c" ; then 
  1811.   echo shar: Will not clobber existing file \"'selectdef.c'\"
  1812. else
  1813. echo shar: Extracting \"'selectdef.c'\" \(6371 characters\)
  1814. sed "s/^X//" >'selectdef.c' <<'END_OF_FILE'
  1815. X/* ta=4 */
  1816. X/*                    s e l e c t d e f . c
  1817. X
  1818. X    allow user to select printer from various *.def files
  1819. X    and also select defaule page size (letter, a4 etc)
  1820. X    
  1821. X    Generate a postscript programme (psizes.ps) that should be
  1822. X    sent to the printer to print out the actual imageable area.
  1823. X*/
  1824. X/*
  1825. X * $Id: selectdef.c,v 3.2 1992/01/19 05:50:33 ajf Exp ajf $
  1826. X *
  1827. X*/
  1828. X
  1829. X#include <stdio.h>
  1830. X#include "ctp.h"
  1831. X
  1832. Xtypedef struct                     /*    measurement in point                    */
  1833. X{    char    paper_name[60];        /*    name of paper size (for command line)    */
  1834. X    char    paper_tray[200];    /*    postscript operator to select this tray    */
  1835. X    int        width;                /*    portrait point width of paper            */
  1836. X    int        height;                /*    portrait point height of paper            */
  1837. X} measure;
  1838. X
  1839. Xchar *psheader = "%!\n\
  1840. X/getsize {\n\
  1841. X    /nf nf 1 add def\n\
  1842. X    clippath\n\
  1843. X    pathbbox\n\
  1844. X} def\n\
  1845. X/sendsize {\n\
  1846. X    /ury exch def\n\
  1847. X    /urx exch def\n\
  1848. X    /lly exch def\n\
  1849. X    /llx exch def\n\
  1850. X    /str 64 string def\n\
  1851. X    show\n\
  1852. X    (  ) show\n\
  1853. X    llx    ceiling cvi str cvs show\n\
  1854. X    (  ) show\n\
  1855. X    lly    ceiling cvi str cvs show\n\
  1856. X    (  ) show\n\
  1857. X    urx    floor cvi str cvs show\n\
  1858. X    (  ) show\n\
  1859. X    ury    floor cvi str cvs show\n\
  1860. X} def\n\
  1861. X/pg save def\n\
  1862. Xnewpath\n\
  1863. X/nf 0 def\n";
  1864. X
  1865. Xchar *psfont = "/Courier findfont 12 scalefont setfont\n";
  1866. X
  1867. Xchar *pstail = "{    /ycoord ycoord -15 add def\n\
  1868. X    50 ycoord moveto\n\
  1869. X    sendsize\n\
  1870. X    /nf nf 1 sub def\n\
  1871. X    nf 0 eq { exit } if\n\
  1872. X} loop\n\
  1873. Xshowpage \n\
  1874. Xpg restore\n\004";
  1875. X
  1876. Xchar    printername[100];
  1877. Xint        defaultsize;
  1878. X
  1879. Xint        screen_lines = 20;
  1880. Xvoid trim();
  1881. X
  1882. Xmain (argc, argv)
  1883. Xint        argc;
  1884. Xchar    *argv[];
  1885. X{    int        i,j;
  1886. X    int        many, n, pnumber;
  1887. X    char    printers[100];
  1888. X    FILE    *fp, *fpdef;
  1889. X    char    cmd[300];
  1890. X    char    resp;
  1891. X    int        lines;
  1892. X    char    *env_lines, *getenv();
  1893. X
  1894. X
  1895. X    if (env_lines = getenv ("LINES"))
  1896. X        screen_lines = atoi (env_lines) - 4;
  1897. X    
  1898. X    if (argc < 2)
  1899. X    {    fprintf (stderr, "Cannot find printer definition files (*.def)...\n");
  1900. X        exit (1);
  1901. X    }
  1902. Xredo:
  1903. X    do
  1904. X    {
  1905. X        pnumber = 0;
  1906. X        printf ("\n\n\n                         SELECT PRINTER TYPE\n\n");
  1907. X        many = 0;
  1908. X        lines = 0;
  1909. X        for (i = 1;  i < argc;  i++)
  1910. X        {    if ((fp = fopen (argv[i], "r")) == NULL)
  1911. X                exit (1);
  1912. X            fgets (printers, 99, fp);    /* skip *printer */
  1913. X            fgets (printers, 99, fp);
  1914. X            trim (printers);
  1915. X            n = strlen (printers);
  1916. X            if (n < 33)
  1917. X                n = 33;
  1918. X            many += n;    
  1919. X            if (many > 66)
  1920. X            {    many = n;
  1921. X                lines++;
  1922. X                if (lines % screen_lines == 0)
  1923. X                {    if ((pnumber = request (&resp, argc)) > 0)
  1924. X                        goto gotit;
  1925. X                    if (resp == 'R')
  1926. X                        goto redo;
  1927. X                }
  1928. X                else printf ("\n");
  1929. X            }
  1930. X            printf ("%3d: %-34s", i, printers);
  1931. X            fclose (fp);
  1932. X        }
  1933. X    } while ((pnumber = request (&resp, argc)) == 0);
  1934. Xgotit:
  1935. X    printf ("\n");
  1936. X    if (access (argv[pnumber], 4) == 0)
  1937. X    {
  1938. X        if (getsize (argv[pnumber]) == 0)
  1939. X        {    sprintf (cmd, "cp %s psfprint.def", argv[pnumber]);
  1940. X            system (cmd);
  1941. X            genpost (argv[pnumber]);
  1942. X        }
  1943. X    }
  1944. X    else
  1945. X    {    fprintf (stderr, "Cannot find printer definition file: %s\n", argv[pnumber]);
  1946. X        exit (1);
  1947. X    }
  1948. X    exit (0);
  1949. X}
  1950. X
  1951. Xrequest (r, maxno)
  1952. Xchar    *r;
  1953. Xint        maxno;
  1954. X{    char printers[100];
  1955. X    int     pnumber;
  1956. X    do
  1957. X    {    *printers = '\0';
  1958. X        printf ("\n==> ( q = quit, r = refresh display, ENTER = next screen)\n    SELECT PRINTER NUMBER: ");
  1959. X        gets (printers);
  1960. X        if (UCCHAR (*printers) == 'Q')
  1961. X            incomplete ();
  1962. X        if (UCCHAR (*printers) == 'R')
  1963. X        {    *r = 'R';
  1964. X            return (0);
  1965. X        }
  1966. X        pnumber = atoi (printers);
  1967. X        if (pnumber < 1)
  1968. X            break;
  1969. X        else if (pnumber > maxno)
  1970. X            printf ("... Invalid printer number\n");
  1971. X        else
  1972. X            break;
  1973. X    } while (1);
  1974. X    *r = ' ';
  1975. X    return (pnumber);
  1976. X}
  1977. X
  1978. Xgetsize (fn)
  1979. Xchar    *fn;
  1980. X{    char    ptypes[40][100];
  1981. X    char    line[100];
  1982. X    int        ntypes, i, ncol, pnumber;
  1983. X    FILE    *fpdef;
  1984. X
  1985. X    if ((fpdef = fopen (fn, "r")) != NULL)
  1986. X    {    fgets (printername, 99, fpdef);    /* skip *printer */
  1987. X        fgets (printername, 99, fpdef);
  1988. X        trim (printername);
  1989. X        ntypes = 1;
  1990. X        for ( ; ; )
  1991. X        {    fgets (line, 99, fpdef);
  1992. X            if (*line == '*')
  1993. X                break;
  1994. X            trim (line);
  1995. X            strcpy (ptypes[ntypes], line);
  1996. X            fgets (line, 99, fpdef);
  1997. X            fgets (line, 99, fpdef);
  1998. X            ntypes++;
  1999. X        }
  2000. X        fclose (fpdef);
  2001. X        printf ("\nPrinter is: %s\n\n", printername);
  2002. X    }
  2003. X    else
  2004. X    {    fprintf (stderr, "Cannot find printer definition file: %s\n", fn);
  2005. X        return (1);
  2006. X    }
  2007. X    return (0);
  2008. X}
  2009. X
  2010. Xgenpost (f)
  2011. Xchar    *f;
  2012. X{
  2013. X    FILE *pdef, *psfile;
  2014. X    char    line[500];
  2015. X    measure    page_types[40];
  2016. X    int        i, j;
  2017. X    int        x, y;
  2018. X
  2019. X    if ((pdef = fopen (f, "r")) != NULL)
  2020. X    {    fgets (line, 100, pdef);        /* skip *printer         */
  2021. X        fgets (line, 100, pdef);        /*    skip printer name     */
  2022. X        fgets (line, 100, pdef);        /*    skip *paper            */
  2023. X        for (i = 0;  i < 28;  i++)
  2024. X        {    if (fgets (page_types[i].paper_name, 59, pdef) == NULL)
  2025. X                break;
  2026. X            trim (page_types[i].paper_name);
  2027. X            if (page_types[i].paper_name[0] ==  '*')
  2028. X                break;
  2029. X            if (fgets (page_types[i].paper_tray, 199, pdef) == NULL)
  2030. X                bad_file(f);
  2031. X            trim (page_types[i].paper_tray);
  2032. X            if (fgets (line, 100, pdef) == NULL)
  2033. X                bad_file(f);
  2034. X            trim (line);
  2035. X            sscanf (line, "%d%d",
  2036. X                &page_types[i].width,
  2037. X                &page_types[i].height);
  2038. X
  2039. X        }
  2040. X        page_types[i].paper_name[0] = '\0';
  2041. X        fclose (pdef);
  2042. X        if ((psfile = fopen ("psizes.ps", "w")) != NULL)
  2043. X        {    fprintf (psfile, "%s", psheader);
  2044. X            for (j = i-1;  j >= 0;  j--)
  2045. X            {    lcase (line, page_types[j].paper_name);
  2046. X                fprintf (psfile, "%s\n(%-10s:%5d%5d) getsize\n",
  2047. X                            line,
  2048. X                            page_types[j].paper_name,
  2049. X                            page_types[j].width, 
  2050. X                            page_types[j].height);
  2051. X            }
  2052. X/*
  2053. X            fprintf (psfile, "%s\n", page_types[defaultsize].paper_tray);
  2054. X*/
  2055. X            fprintf (psfile, "%s", psfont);
  2056. X            x = 50;
  2057. X            y = 500;
  2058. X            fprintf (psfile, "%d %d moveto\n", x, y);
  2059. X            fprintf (psfile, "(Imageable area) show\n");
  2060. X            y -= 15;
  2061. X            fprintf (psfile, "%d %d moveto\n", x, y);
  2062. X            fprintf (psfile, "(");
  2063. X            send (printername, psfile);
  2064. X            fprintf (psfile, ") show\n");
  2065. X            fprintf (psfile, "/ycoord %d def\n", y);
  2066. X            fprintf (psfile, "%s", pstail);
  2067. X        }
  2068. X        else
  2069. X            fprintf (stderr, "Cannot create psizes.ps\n");
  2070. X    }
  2071. X    else
  2072. X        fprintf (stderr, "Cannot open %s for reading\n", f);
  2073. X}
  2074. X
  2075. X
  2076. Xvoid trim (s)                    /*    trim trailing blanks  and \n */
  2077. Xchar    *s;
  2078. X{    int many;
  2079. X
  2080. X    for (many = strlen (s) - 1;  many >= 0;  many--)
  2081. X    {    if (isgraph (s[many]))
  2082. X            break;
  2083. X        else
  2084. X            s[many] = '\0';
  2085. X    }
  2086. X}
  2087. X
  2088. X
  2089. X
  2090. Xbad_file(f)
  2091. Xchar    *f;
  2092. X{
  2093. X    fprintf (stderr, "Bad %s file\n", f);
  2094. X    exit (1);
  2095. X}
  2096. X
  2097. Xlcase (a, b)
  2098. Xchar    *a, *b;
  2099. X{
  2100. X    while (*b)
  2101. X    {    *a++ = LCCHAR (*b);
  2102. X        b++;
  2103. X    }
  2104. X    *a = '\0';
  2105. X}
  2106. X
  2107. Xsend (s, fp)
  2108. Xchar    *s;
  2109. XFILE    *fp;
  2110. X{
  2111. X    char    *strchr();
  2112. X    
  2113. X    while (*s)
  2114. X    {
  2115. X        if (strchr ("\r\b\\()", *s) != NULL)
  2116. X            fputc ('\\', fp);
  2117. X        fputc (*s, fp);
  2118. X        s++;
  2119. X    }
  2120. X}
  2121. X
  2122. Xincomplete ()
  2123. X{
  2124. X    printf ("Incomplete printer installation\n");
  2125. X    exit (44);
  2126. X}
  2127. END_OF_FILE
  2128. if test 6371 -ne `wc -c <'selectdef.c'`; then
  2129.     echo shar: \"'selectdef.c'\" unpacked with wrong size!
  2130. fi
  2131. # end of 'selectdef.c'
  2132. fi
  2133. echo shar: End of archive 5 \(of 9\).
  2134. cp /dev/null ark5isdone
  2135. MISSING=""
  2136. for I in 1 2 3 4 5 6 7 8 9 ; do
  2137.     if test ! -f ark${I}isdone ; then
  2138.     MISSING="${MISSING} ${I}"
  2139.     fi
  2140. done
  2141. if test "${MISSING}" = "" ; then
  2142.     echo You have unpacked all 9 archives.
  2143.     rm -f ark[1-9]isdone ark[1-9][0-9]isdone
  2144. else
  2145.     echo You still need to unpack the following archives:
  2146.     echo "        " ${MISSING}
  2147. fi
  2148. ##  End of shell archive.
  2149. exit 0
  2150.  
  2151. exit 0 # Just in case...
  2152.